/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package ModuloDiagnosticador;

import ModuloBaseDelConocimiento.*;
import ModuloControladorBD.*;
import java.util.*;

/**
 *
 * @author rayner
 */
public class procesadorEntradaSalida {
    private ArtKohonen kohonen;
    private Caso cas_winner;
    private List<Enfermedad> enfermedades;
    private List<ListaDeSintomas> listaDeSintomas;
    private int check[];
    private ArrayList<Integer> sintPresentes;
    private ArrayList<Integer> sintNoPresentes;
    private boolean activoK ;
    

    public procesadorEntradaSalida(){
        EnfermedadJpaController enf_cont = new EnfermedadJpaController();
        enfermedades = enf_cont.findEnfermedadEntities();
        ListaDeSintomasJpaController lista_cont = new ListaDeSintomasJpaController();
        listaDeSintomas = lista_cont.findListaDeSintomasEntities();
        sintPresentes = new ArrayList<Integer>();
        sintNoPresentes = new ArrayList<Integer>();
        check = new int[listaDeSintomas.size()];
        activoK = false;
    }
    public void ActivarKohonen(){
        kohonen = new ArtKohonen(0.01, 0.3);
        kohonen.EntrenarRed();
        activoK = true;
    }
    public void recuperarCaso(){
        if(!activoK) return;
        cas_winner = kohonen.Recuperar(this.getCheck());
        return;
    }
    
    public int getEnfermedadWinner(){
        if(cas_winner == null) return 0;
        return cas_winner.getEnfermedad().getId();
    }
    public String getResultado(){
        if(cas_winner == null) return "Al parecer no se pudo conseguir un caso similar al ingresado.!";
        return cas_winner.getDescripcion();
    }
    public void guardarCaso(String descripcion , int sexo, int edad, int enfer){

        Caso caso_nuevo = new Caso();
        caso_nuevo.setDescripcion(descripcion);
        caso_nuevo.setSexoPaciente(sexo);
        caso_nuevo.setEdadPaciente(edad);

        SintomaOSignoJpaController sintCont = new SintomaOSignoJpaController();
        int cont = sintCont.getSintomaOSignoCount();
        caso_nuevo.setEnfermedad(enfermedades.get(enfer));
        CasoJpaController contCaso = new CasoJpaController();
        caso_nuevo.setId(contCaso.getCasoCount() + 1);
        contCaso.create(caso_nuevo);

        for(int i = 0; i < sintPresentes.size() ; i ++){
            SintomaOSigno sint = new SintomaOSigno();
            sint.setNombre(listaDeSintomas.get(sintPresentes.get(i)).getNombre());
            sint.setCaso(caso_nuevo);
            sint.setPresente(Boolean.TRUE);
            sint.setDescripcion("");
            sint.setId(++cont );
            sintCont.create(sint);
        }
        for(int i = 0; i < sintNoPresentes.size() ; i ++){
            SintomaOSigno sint = new SintomaOSigno();
            sint.setNombre(listaDeSintomas.get(sintNoPresentes.get(i)).getNombre());
            sint.setCaso(caso_nuevo);
            sint.setPresente(Boolean.FALSE);
            sint.setDescripcion("");
            sint.setId(++cont );
            sintCont.create(sint);
        }
    }
    public String[] getEnfermedadesNames(){
        String[] names = new String[enfermedades.size()];
        for(int i = 0; i < enfermedades.size() ; i ++){
            names[i] = enfermedades.get(i).getNombre();
        }
        return names;
    }
    public String[] getSintomasNames(){
        String[] names = new String[listaDeSintomas.size()];
        for(int i = 0; i < listaDeSintomas.size() ; i ++){
            names[i] = listaDeSintomas.get(i).getNombre();
        }
        return names;
    }
    public ArrayList<Integer> buscarSintomas(String query){
        ArrayList<Integer> SintomasId  = new ArrayList<Integer>();
        for(int i = 0 ; i < listaDeSintomas.size(); i ++){
            if(listaDeSintomas.get(i).getNombre().toLowerCase().indexOf(query.toLowerCase()) >= 0 && check[i] == 0){
                SintomasId.add(listaDeSintomas.get(i).getId() - 1);
            }
        }
        return SintomasId;
    }
    public void setCheckPosition(int index, int val){
        check[index] = val;
    }
    public int noToSint(int index){
        int p = sintNoPresentes.get(index);
        sintNoPresentes.remove(index);
        return p;
    }
    public int siToSint(int index){
        int p = sintPresentes.get(index);
        sintPresentes.remove(index);
        return p;
    }
    public void sintToNo(int index){
        sintNoPresentes.add(index);
    }
    public void sintToSi(int index){
        sintPresentes.add(index);
    }
    public double[] getCheck(){
        double []checkDouble = new double[check.length];
        for(int i = 0; i < check.length; i ++){
            checkDouble[i] = (double)check[i];
        }
        return checkDouble;
    }
}
